#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>

#define MAX_MSG_SIZE 100
#define MSG_KEY 1234

// 消息结构体
typedef struct {
    long mtype;
    char mtext[MAX_MSG_SIZE];
} Message;

int main() {
    int msgid;
    Message msg;
    Message temp_queue[100];  // 临时存储消息的数组
    int temp_count = 0;

    // 获取消息队列
    if ((msgid = msgget(MSG_KEY, 0666)) == -1) {
        perror("msgget");
        exit(1);
    }

    while (1) {
        char book_type[10];
        printf("请输入要取书的类型（输入 0 结束取书）：");
        scanf("%s", book_type);

        if (strcmp(book_type, "0") == 0) {
            // 删除消息队列
            if (msgctl(msgid, IPC_RMID, NULL) == -1) {
                perror("msgctl");
                exit(1);
            }
            break;
        }

        int found = 0;
        temp_count = 0;

        // 先将队列中的所有消息取出到临时数组
        while (msgrcv(msgid, &msg, MAX_MSG_SIZE, 1, IPC_NOWAIT) != -1) {
            temp_queue[temp_count++] = msg;
        }

        // 遍历临时数组查找指定类型的书
        for (int i = 0; i < temp_count; i++) {
            char type[10];
            char name[50];
            sscanf(temp_queue[i].mtext, "%s %s", type, name);

            if (strcmp(type, book_type) == 0) {
                printf("找到类型为 %s 的书：%s\n", book_type, name);
                found = 1;
            } else {
                // 放回队列
                if (msgsnd(msgid, &temp_queue[i], strlen(temp_queue[i].mtext) + 1, 0) == -1) {
                    perror("msgsnd");
                    exit(1);
                }
            }
        }

        if (!found) {
            printf("没有类型为 %s 的书。\n", book_type);
        }
    }

    return 0;
}    